﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MetaView.Mvvm.Apis.Common;

/// <summary>
/// 标准化API响应封装（支持泛型/非泛型）
/// 适配.NET 8+特性
/// </summary>
public class CommonResult<T>
{
    // 静态状态码（使用readonly替代常量以支持动态配置）
    public static readonly int CODE_SUCCESS = 200;
    public static readonly int CODE_ERROR = 500;
    public static readonly int CODE_NOT_FOUND = 404;

    /// <summary>
    /// 状态码（使用属性而非字段）
    /// </summary>
    public int Code { get; private set; }

    /// <summary>
    /// 状态信息（添加JsonProperty特性以兼容不同命名风格）
    /// </summary>
    [JsonProperty("message")]
    public string Msg { get; private set; }

    /// <summary>
    /// 返回数据（支持可空类型）
    /// </summary>
    public T? Data { get; private set; }

    /// <summary>
    /// 请求耗时（毫秒，新增性能监控字段）
    /// </summary>
    public long ElapsedMs { get; set; }

    // 构造函数私有化，强制使用工厂方法 
    private CommonResult(int code, string msg, T? data)
    {
        Code = code;
        Msg = msg;
        Data = data;
    }

    // ================== 静态工厂方法 ================== //
    public static CommonResult<T> Success(T? data = default, string message = "操作成功")
    {
        return new CommonResult<T>(CODE_SUCCESS, message, data);
    }

    public static CommonResult<T> Error(string message = "操作失败", T? data = default)
    {
        return new CommonResult<T>(CODE_ERROR, message, data);
    }

    public static CommonResult<T> Custom(int code, string message, T? data = default)
    {
        return new CommonResult<T>(code, message, data);
    }
}